<?php
class App
{
    protected static $db;
    //执行入口
    static function run($ac)
    {
        //载入mysql
        self::mysql();
        //获取栏目信息
        $navs=self::navs();
        //获取标签信息
        $tags=self::tags();
        //获取分类信息
        $path=isset($_GET['path']) ? trim($_GET['path']) : null;
        $list=is_null($path) ? null : self::_lists($navs,$path);
        switch($ac)
        {
        case 'list':
            $data=self::lists($list);
            break;
        case 'show':
            $data=self::show();
            break;
        case 'vod':
            $data=self::vod($list);
            break;
        case 'search':
            $data=self::search();
            break;
        default:
            self::index();
        }
        //模板输出
        $tpl=ROOT.'/themes/'.THEME.'/'.$ac.'.php';
        file_exists($tpl) or show_error($tpl.'模板文件不存在!');
        require_once $tpl;
    }
    //载入数据库配置
    protected static function mysql()
    { 
        $database=spyc_load_file('config/database.yaml');
        self::$db=new medoo($database[ENVIRONMENT]);
    }
    //获取分类配置文件
    protected static function navs()
    {
        $lists_file='config/lists.yaml';
        file_exists($lists_file) or self::write_config($lists_file,'lists');
        $data=spyc_load_file($lists_file) or show_error('分类配置文件不正确!');    
        return $data;
    }
    //获取Tag标签配置文件
    protected static function tags()
    {
        $tags_file='config/tags.yaml';
        file_exists($tags_file) or self::write_config($tags_file,'tags');
        $data=spyc_load_file($tags_file) or show_error('标签配置文件不正确!');
        return $data; 
    }
    //写入配置文件
    protected static function write_config($file,$table)
    {
        //读取配置数据
        $rs=self::$db->select($table,"*",['status'=>1]);
        if($table=='lists')
        {
            //栏目使用path做key
            $data=array();
            foreach($rs as $v)
            {
                $data[$v['path']]=$v; 
            }
            $yaml=spyc_dump($data);
        }
        else
        {
            $yaml=spyc_dump($rs); 
        }
        //写入文件
        return write_file($file,$yaml);
    }
    //获取分类信息
    protected static function _lists($navs,$path)
    {
        //判断分类是否合法存在
        $preg='/^('.implode('|',array_keys($navs)).')$/i';
        preg_match("{$preg}",$path) or show_error('此页面不存在!');
        //获取该分类数据
        return $navs[$path];
    }
    //网站首页
    protected static function index()
    {
        return 'index';
    }
    //获取内容列表
    protected static function lists($list)
    {
        !is_null($list) or show_error('请求参数不正确!');
        $data=self::$db->select('films',"*",['AND'=>['fid'=>$list['id'],'status'=>1]]);
        return $data;
    }
    //内容显示页面
    protected static function show()
    {
        //获取内容Id
        $id=isset($_GET['id']) ? trim($_GET['id']) : show_error('请求参数不正确');
        //判断Id是否合法
        preg_match('/^([0-9]{1,5}+)$/i',$id) or show_error('不合法id参数');
        //获取内容信息
        $data=self::$db->get('films',"*",['AND'=>['id'=>$id,'status'=>1]]) or show_error('该影片不存在或已经删除!');
        return $data;
    }
    //vod播放页面
    protected static function vod($list)
    {
        //获取内容Id
        $id=isset($_GET['id']) ? trim($_GET['id']) : show_error('请求参数不正确');
        //判断Id是否合法
        preg_match('/^([0-9]{1,5}+)$/i',$id) or show_error('不合法id参数');
        //获取影片CD
        $cd=isset($_GET['cd']) ? trim($_GET['cd']) : show_error('请求参数不正确');
        //判断CD参数是否合法
        preg_match('/^([1-9]{1}+)$/i',$cd) or show_error('不合法cd参数');
        //获取内容信息
        $and=['id'=>$id,'fid'=>$list['id'],'status'=>1];
        $data=self::$db->get('films',['name','films'],['AND'=>$and]) or show_error('该影片不存在或已经删除!');
        //分割字符串
        $strs=explode('$$',trim($data['films']));
        //判断CD参数在数据库中是否有效
        count($strs)>=$cd or show_error('不合法cd参数');
        //获取有效的播放地址
        $data['films']=$strs[$cd-1];
        return $data;
    }
    //内容检索页面
    protected static function search()
    {
        //获取类别
        $type=isset($_GET['type']) ? trim($_GET['type']) : show_error('请求参数不正确');
        //判断类别是否合法存在
        $preg='/^(wd|tag|actor)$/i';
        preg_match("{$preg}",$type) or show_error('此页面不存在!');
        //获取查询名称
        $name=isset($_GET['name']) ? trim($_GET['name']) : show_error('请求参数不正确');
        //过滤特殊字符
        $symbol=array('~','!','@','#','$','%','^','&','*','`','(',')','<','>','?',',',' ');
        $nullstr=array('','','','','','','','','','','','','','','','','','');
        $name=str_replace($symbol,$nullstr,$name);
        //判断是否为合法字符
        $cn_preg='/^[\x{4e00}-\x{9fa5}]{1,4}/u';
        $en_preg='/^[a-zA-Z0-9]{1,4}/i';
        preg_match("{$cn_preg}",$name) || preg_match("{$en_preg}",$name) or show_error('请求参数不正确');
        //模糊查询
        $and=['films.status'=>1,'lists.status'=>1];
        switch($type)
        {
        case 'tag':
            $map=['LIKE'=>['films.tags'=>$name],'AND'=>$and];
            $error_say='检索不到该标签内容!';
            break; 
        case 'actor':
            $map=['LIKE'=>['films.actors'=>$name],'AND'=>$and];
            $error_say='检索不到该演员内容!';
            break;
        default:
            $map=['LIKE'=>['films.name'=>$name],'AND'=>$and];
            $error_say='检索不到该词内容!';
        }
        //显示字段
        $fields=['films.id','films.name','films.pics','lists.path'];
        //关联查询
        $data=self::$db->select('films',['[>]lists'=>['fid'=>'id']],$fields,$map) or show_error($error_say);
        return $data;
    }
}
